#include "cc_list.h"
#include "cc_log.h"

int cc_list_reinit(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");
    return CC_ENOMEM;
  }
  // 未初始化就直接初始化就行 不需要反初始化
  if (!cc_list_is_init(list))
  {
    return cc_list_init(list);
  }
  if (cc_list_deinit(list) != CC_EOK)
  {
    cc_log_e("deinit failed\r\n");
  }
  return cc_list_init(list);
}

int cc_list_deinit(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");
    return CC_ENOMEM;
  }
  if (cc_list_is_init(list))
  {

    for (size_t i = 0; i < list->uxNumberOfItems; i++)
    {
      cc_list_remove(listGET_NEXT(list->pxIndex));
    }
    list->xListEnd.xItemValue = 0;
    return CC_EOK;
  }
  else
  {
    cc_log_e("repeat deinit\r\n");
    return CC_EBUSY;
  }
}

int cc_list_is_init(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");

    return CC_ENOMEM;
  }

  return listLIST_IS_INITIALISED(list);
}

int cc_list_init(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");
    return CC_ENOMEM;
  }
  if (cc_list_is_init(list))
  {
    cc_log_e("repeat init\r\n");
    return CC_EBUSY;
  }
  vListInitialise(list);
  if (cc_list_is_init(list))
    return CC_EOK;
  else
    return CC_EBUSY;
}
int cc_list_node_init(cc_list_node* node)
{
  if (node == CC_NULL)
  {
    cc_log_e("no mem\r\n");

    return CC_ENOMEM;
  }
  vListInitialiseItem(node);
  return CC_EOK;
}
uint32_t cc_list_get_length(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");

    return 0xffffff;
  }
  if (!cc_list_is_init(list))
  {
    cc_log_e("no init\r\n");

    return CC_EBUSY;
  }

  return listCURRENT_LIST_LENGTH(list);
}
int cc_list_insert_after(cc_list* list, cc_list_node* node)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");
    return CC_ENOMEM;
  }
  if (!cc_list_is_init(list))
  {
    cc_log_e("no init\r\n");
    return CC_EBUSY;
  }
  vListInsertEnd(list, node);
  return CC_EOK;
}
//  void cc_list_insert_before(cc_list *list, cc_list_node *node){

// }
int cc_list_remove(cc_list_node* node)
{
  if (node == CC_NULL)
  {
    cc_log_e("no mem\r\n");

    return 0xffffff;
  }

  return uxListRemove(node);
}
int cc_list_isempty(cc_list* list)
{
  if (list == CC_NULL)
  {
    cc_log_e("no mem\r\n");

    return 0xffffff;
  }
  if (!cc_list_is_init(list))
  {
    cc_log_e("no init\r\n");

    return CC_EBUSY;
  }
  return listLIST_IS_EMPTY(list);
}
